home *** CD-ROM | disk | FTP | other *** search
Text File | 1986-04-19 | 7.1 KB | 721 lines | [TEXT/MACA] |
- /*
-
- * C Declare -- a desk accessory written in Aztec C
-
- *
-
- * This DA assists you in declaring C variables and functions.
-
- *
-
- * Written by Michael P. Hecht, 10jan86
-
- */
-
- #asm
-
- main
-
- dc.w $0400 ;ctl-enable
-
- dc.w 0 ;no update
-
- dc.w $014a ;detect mouse and key down events
-
- dc.w 0 ;menu ID number (none)
-
-
-
- dc.w open_-main ;open routine
-
- dc.w nop_-main ;prime routine
-
- dc.w control_-main ;control routine
-
- dc.w nop_-main ;status routine
-
- dc.w close_-main ;close routine
-
-
-
- title_
-
- dc.b 9
-
- dc.b "C Declare"
-
- ds 0 ;for alignment
-
-
-
- public _Uend_,_Dorg_,_Cend_
-
-
-
- save_
-
- lea main+(_Uend_-_Dorg_)+(_Cend_-main),a4 ;set up globals
-
- move.l a0,Pbp_ ;save pb pointer
-
- move.l a1,Dp_ ;save DCE pointer
-
- rts
-
-
-
- restore_
-
- move.l Pbp_,a0
-
- rts
-
- #endasm
-
-
-
- #define _DRIVER
-
- #include <quickdraw.h>
-
- #include <event.h>
-
- #include <window.h>
-
- #include <control.h>
-
- #include <textedit.h>
-
- #include <dialog.h>
-
- #include <desk.h>
-
- #include <scrap.h>
-
- #include <toolutil.h>
-
- #include <memory.h>
-
- #include <pb.h>
-
- #include <osutil.h>
-
-
-
- #define SP (*(struct storage **)Dp->dCtlStorage)
-
-
-
- /* Dialog item numbers */
-
- #define FUNC_RET 1
-
- #define ARRAY_OF 2
-
- #define PTR_TO 3
-
- #define TEXT 4
-
-
-
- /* Owned resource id equates */
-
- #define OWNED 0xc000
-
- #define BY_DRVR 0x0000
-
- #define BY_WDEF 0x0800
-
- #define BY_MDEF 0x1000
-
- #define BY_CDEF 0x1800
-
- #define BY_PDEF 0x2000
-
- #define BY_PACK 0x2800
-
- #define BY_ID_SHIFT 5
-
-
-
- DCEPtr Dp;
-
- ParmBlkPtr Pbp;
-
-
-
- /* Private storage */
-
- struct storage :
-
- int first;
-
- ControlHandle func_button;
-
- ControlHandle array_button;
-
- Handle text;
-
- StringHandle init;
-
- :;
-
-
-
- open()
-
- :
-
- register struct DCE *dp;
-
- register struct storage *sp;
-
- register WindowPtr wp;
-
- register StringHandle s;
-
- register int dlog_id;
-
- int junk;
-
- Rect box;
-
-
-
-
-
- save();
-
- dp = Dp;
-
- wp = dp->dCtlWindow;
-
-
-
- /* First open? Allocate private storage if so. */
-
- if( !wp ) :
-
- dp->dCtlStorage = NewHandle(( long )sizeof( struct storage ));
-
- :
-
-
-
- /* Lock it down and dereference it */
-
- HLock( dp->dCtlStorage );
-
- sp = SP;
-
-
-
- /* First open? Allocate DLOG and init other stuff if so. */
-
- if( !wp ) :
-
- /* Compute resource id of DLOG at runtime */
-
- dlog_id = -( dp->dCtlRefNum + 1 );
-
- dlog_id <<= BY_ID_SHIFT;
-
- dlog_id |= OWNED | BY_DRVR | 0;
-
-
-
- /* Bring up the window */
-
- dp->dCtlWindow = wp = GetNewDialog( dlog_id, 0L, -1L );
-
-
-
- /* Grab control handles for the buttons we want to hilite */
-
- GetDItem( wp, FUNC_RET, &junk, &sp->func_button, &box );
-
- GetDItem( wp, ARRAY_OF, &junk, &sp->array_button, &box );
-
-
-
- /* Grab TE handle so we can modify the text quickly */
-
- GetDItem( wp, TEXT, &junk, &sp->text, &box );
-
-
-
- /* Grab the initial text in a resizable handle */
-
- s = NewHandle(( long )sizeof( Str255 ));
-
- HLock( s );
-
- GetIText( sp->text, *s );
-
- HUnlock( s );
-
- SetHandleSize( s, ( long )(( *s )->length + 1 ));
-
- sp->init = s;
-
- sp->first = TRUE;
-
-
-
- :
-
- /* Otherwise, reset if reopened from the front, reset */
-
- else if( wp == FrontWindow()) :
-
- (( WindowPeek )wp )->windowKind = dialogKind;
-
-
-
- HiliteControl( sp->func_button, 0 );
-
- HiliteControl( sp->array_button, 0 );
-
-
-
- s = sp->init;
-
- HLock( s );
-
- SetIText( sp->text, *s );
-
- HUnlock( s );
-
-
-
- sp->first = TRUE;
-
- :
-
-
-
- (( WindowPeek )wp )->windowKind = dp->dCtlRefNum;
-
- HUnlock( dp->dCtlStorage );
-
- restore();
-
- return 0;
-
- :
-
-
-
- close()
-
- :
-
- register struct DCE *dp;
-
- register WindowPtr wp;
-
-
-
-
-
- save();
-
- dp = Dp;
-
-
-
- wp = dp->dCtlWindow;
-
- (( WindowPeek )wp )->windowKind = dialogKind;
-
- DisposDialog( wp );
-
- dp->dCtlWindow = 0;
-
-
-
- DisposHandle( SP->init );
-
- DisposHandle( dp->dCtlStorage );
-
-
-
- restore();
-
- return 0;
-
- :
-
-
-
- nop()
-
- :
-
- return 0;
-
- :
-
-
-
- control()
-
- :
-
- register struct DCE *dp;
-
- register struct storage *sp;
-
- register WindowPtr wp;
-
- register int what;
-
- EventRecord fakenull;
-
-
-
-
-
- save();
-
- dp = Dp;
-
- HLock( dp->dCtlStorage );
-
- sp = SP;
-
-
-
- wp = dp->dCtlWindow;
-
- /* Change windowKind so the dialog mgr will recognize it */
-
- (( WindowPeek )wp )->windowKind = dialogKind;
-
-
-
- what = Pbp->u.cp.csCode;
-
-
-
- switch( what ) :
-
-
-
- case accEvent:
-
- event( sp, *( EventRecord ** )&Pbp->u.cp.csParam,
-
- wp );
-
- break;
-
-
-
- case accCursor:
-
- /* This blinks the caret */
-
- fakenull.what = nullEvent;
-
- DialogSelect( &fakenull, 0L, 0L );
-
- break;
-
-
-
- default:
-
- /* Assume it's an edit something */
-
- edit( what, sp, wp );
-
- break;
-
- :
-
-
-
- HUnlock( dp->dCtlStorage );
-
- (( WindowPeek )wp )->windowKind = dp->dCtlRefNum;
-
-
-
- restore();
-
- return 0;
-
- :
-
-
-
- event( sp, ep, wp )
-
- register struct storage *sp;
-
- register EventRecord *ep;
-
- WindowPtr wp;
-
- :
-
- register StringHandle s;
-
- register int eventcode;
-
- int item;
-
-
-
-
-
- /* Keydown with command modifier? */
-
- if( ep->what == keyDown ) :
-
- switch(( char )( ep->message & charCodeMask )) :
-
- case 'Z':
-
- case 'z':
-
- eventcode = accUndo;
-
- break;
-
- case 'X':
-
- case 'x':
-
- eventcode = accCut;
-
- break;
-
- case 'C':
-
- case 'c':
-
- eventcode = accCopy;
-
- break;
-
- case 'V':
-
- case 'v':
-
- eventcode = accPaste;
-
- break;
-
- case '\t':
-
- SelIText( wp, TEXT, 0, 0x7fff );
-
- return;
-
- default:
-
- eventcode = -1;
-
- break;
-
- :
-
- if( eventcode >= 0 && ep->modifiers & cmdKey ) :
-
- edit( eventcode, sp, wp );
-
- return;
-
- :
-
- :
-
-
-
- if( !DialogSelect( ep, &wp, &item ))
-
- return;
-
-
-
- /* Grab the current text in a resizable handle */
-
- s = NewHandle(( long )sizeof( Str255 ));
-
- HLock( s );
-
- GetIText( sp->text, *s );
-
- HUnlock( s );
-
- SetHandleSize( s, ( long )(( *s )->length + 1 ));
-
-
-
- switch( item ) :
-
- case FUNC_RET:
-
- HiliteControl( sp->func_button, 255 );
-
- HiliteControl( sp->array_button, 255 );
-
-
-
- if( !sp->first )
-
- paren( s );
-
- else
-
- sp->first = FALSE;
-
-
-
- PtrAndHand( "()", s, 2L );
-
- ( *s )->length += 2;
-
- break;
-
-
-
- case ARRAY_OF:
-
- HiliteControl( sp->func_button, 255 );
-
-
-
- if( !sp->first )
-
- paren( s );
-
- else
-
- sp->first = FALSE;
-
-
-
- PtrAndHand( "[]", s, 2L );
-
- ( *s )->length += 2;
-
- break;
-
-
-
- case PTR_TO:
-
- HiliteControl( sp->func_button, 0 );
-
- HiliteControl( sp->array_button, 0 );
-
-
-
- sp->first = FALSE;
-
-
-
- Munger( s, 1L, 0L, 0L, "*", 1L );
-
- ( *s )->length++;
-
- break;
-
- :
-
- HLock( s );
-
- SetIText( sp->text, *s );
-
- DisposHandle( s );
-
- :
-
-
-
- paren( s )
-
- register StringHandle s;
-
- :
-
- Munger( s, 1L, 0L, 0L, "(", 1L );
-
- PtrAndHand( ")", s, 1L );
-
- ( *s )->length += 2;
-
- :
-
-
-
- edit( code, sp, wp )
-
- int code;
-
- register struct storage *sp;
-
- register WindowPtr wp;
-
- :
-
- switch( code ) :
-
- case accUndo:
-
- /* Not supported */
-
- break;
-
-
-
- case accCut:
-
- DlgCut( wp );
-
- break;
-
-
-
- case accCopy:
-
- DlgCopy( wp );
-
- break;
-
-
-
- case accPaste:
-
- DlgPaste( wp );
-
- break;
-
-
-
- case accClear:
-
- DlgDelete( wp );
-
- break;
-
-
-
- default:
-
- return;
-
- :
-
- ZeroScrap();
-
- TEToScrap();
-
- :
-
-
-
-